package top.luckyluxcis.api;

import com.alibaba.fastjson2.JSONObject;
import lombok.experimental.UtilityClass;
import top.luckyluxcis.RollApi;
import top.luckyluxcis.consts.ProductType;
import top.luckyluxcis.type.CloudParamProduct;
import top.luckyluxcis.util.Base64Util;
import top.luckyluxcis.util.MapUtil;

import java.util.List;
import java.util.Map;

/**
 * <pre>
 * 自定义远程配置，远程存储json数据。比如App正在应用市场进行审核的时候，需要隐藏一些敏感的页面，一个敏感的功能，
 * 防止审核员看到后会让应用审核不通过，这个时候就需要一个在线自定义的参数，来告诉App当前是否是审核的敏感期，来做对应的处理。
 * </pre>
 *
 * @author Zhuang
 * @since 2023/09/25
 */
@SuppressWarnings("unused")
@UtilityClass
public class CloudParamUtil {
    private static final RollApi API = RollApi.getInstance();

    /**
     * 用户创建一个应用来启用在线自定义参数的功能。
     *
     * @param type   应用类型，0-移动应用 1-网页应用
     * @param name   应用名称（不可为空）
     * @param desc   应用描述
     * @param userId 用户id（这个目前不支持自己注册，需要联系管理员给你分配）
     * @return {@link CloudParamProduct}
     */
    public static CloudParamProduct createProduct(ProductType type, String name, String desc, String userId) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("type", type.getCode())
                .put("name", name)
                .put("desc", desc)
                .put("user_id", userId)
                .build();
        return API.get("/admin/user/product/add", params, CloudParamProduct.class);
    }

    /**
     * 获取用户创建的所有应用列表。
     *
     * @param userId 用户id（这个目前不支持自己注册，需要联系管理员给你分配）
     * @return {@link List}<{@link CloudParamProduct}>
     */
    public static List<CloudParamProduct> productList(String userId) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("user_id", userId)
                .build();
        return API.get("/admin/user/product/add", params, List.class, CloudParamProduct.class);
    }

    /**
     * 给指定应用设置在线参数。
     *
     * @param userId    用户id（这个目前不支持自己注册，需要联系管理员给你分配）
     * @param secret    应用的secret，可从应用列表获取
     * @param productId 应用的product_id，可从应用列表获取
     * @param config    在线参数的值。
     */
    public static void setConfig(String userId, String secret, String productId, Map<String, Object> config) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("user_id", userId)
                .put("secret", secret)
                .put("product_id", productId)
                .put("config", Base64Util.encode(JSONObject.toJSONString(config)))
                .build();
        API.post("/admin/remote_config/set", params);
    }

    /**
     * 获取指定应用的在线参数。
     *
     * @param userId    用户id（这个目前不支持自己注册，需要联系管理员给你分配）
     * @param secret    应用的secret，可从应用列表获取
     * @param productId 应用的product_id，可从应用列表获取
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    public static Map<String, Object> getConfig(String userId, String secret, String productId) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("user_id", userId)
                .put("secret", secret)
                .put("product_id", productId)
                .build();
        return ((CloudParamProduct) API.post("/admin/remote_config/set", params, CloudParamProduct.class)).getProductConfig();
    }
}
